perm filename ALL.MF[CM,DEK] blob sn#788855 filedate 1985-04-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	% scraps of code that will eventually be a complete base file
C00026 00003	% Computer Modern Roman 10 point
C00032 00004	% Computer Modern Sans Serif Bold Extended 10 pt
C00038 00005	% Computer Modern Typewriter Text for use with 10 point
C00044 00006	% Computer Modern Bold Extended Roman 10 point
C00050 00007	% Computer Modern Bold Extended Roman 5 point
C00056 00008	% Computer Modern Sans Serif Demibold Condensed 10 pt
C00062 00009	% Computer Modern Sans Serif Quotation Style Slanted 8 point
C00068 00010	% Computer Modern Text Italic 10 point
C00074 00011	% Computer Modern Bold Roman 10 point
C00080 00012	% Computer Modern Funny 10 point
C00087 ENDMK
C⊗;
% scraps of code that will eventually be a complete base file
cmbase:=1; % when cmbase is known, this file has been input

let cmchar=\; % cmchar should precede each character, for testing purposes
let generate=input; % `generate' should follow the parameters

boolean square_dots,hefty,serifs,
 monospace,variant_g,low_asterisk,math_fitting;

newinternal slant,fudge,math_spread,superness,superpull,beak_darkness,ligs;

vardef serif@#(suffix $,$$)(expr darkness,jut) suffix modifier =
	% serif at |z$| for stroke from |z$$|
 pickup crisp.nib; numeric bracket_height; pair downward;
 bracket_height=if str modifier="dark": 1.5 fi bracket;
 if y$<y$$: y@#2=min(y$+bracket_height,y$$);
  top y@#1-slab=bot y@#0=tiny.bot y$; downward=z$-z$$;
  if y@#1>y@#2: y@#2:=y@#1; fi
 else: y@#2=max(y$-bracket_height,y$$);
  bot y@#1+slab=top y@#0=tiny.top y$; downward=z$$-z$;
  if y@#1<y@#2: y@#2:=y@#1; fi fi
 if jut<0: z@#2+penoffset downward of currentpen =
   z$l+penoffset downward of pen_[tiny.nib]+whatever*downward;
  z@#3=z@#2+(epsilon,0); lft x@#0=lft x@#1=tiny.lft x$l+jut;
 else: z@#2-penoffset downward of currentpen =
   z$r-penoffset downward of pen_[tiny.nib]+whatever*downward;
  z@#3=z@#2-(epsilon,0); rt x@#0=rt x@#1=tiny.rt x$r+jut; fi
 pair corner; ypart corner=y@#1; corner=z@#2+whatever*(z$-z$$);
 filldraw z@#2{z$-z$$}
  ...darkness[corner,.5[z@#1,z@#2] ]{z@#1-z@#2}
  ...{jut,0}z@#1--z@#0--(x$,y@#0)--z@#3--cycle; % the serif
 labels (@#1,@#2); enddef;

def cup_serif(suffix @,@@,$,$$)
  (expr left_darkness,left_jut,right_darkness,right_jut)
  suffix modifier =
 serif$(@,@@,left_darkness,-left_jut) modifier;
 serif$$(@,@@,right_darkness,right_jut) modifier;
 if cup>0: pickup tiny.nib; numeric cup_out,cup_in;
  if y@<y@@: cup_out=bot y@; cup_in=cup_out+cup;
  else: cup_out=top y@; cup_in=cup_out-cup; fi
  erase fill (x$1,cup_out)..(x@,cup_in)..(x$$1,cup_out)--cycle;
 fi enddef;

vardef sloped_serif.l(suffix $,$$,@)(expr darkness,jut,drop) =
 pickup crisp.nib; penpos@2(slab-crisp,90);
 lft x@0=tiny.lft x$l; rt x@1=tiny.rt x$r;
 top y@1=tiny.top y$r;
 lft x@2=lft x@0-jut; y@2r=y@1-drop;
 y@0=max(y@2l-bracket,y$$)-epsilon;
 erase fill z@1--top z@1--(x@2r,top y@1)--z@2r--cycle; % erase excess at top
 filldraw z@1--z@2r--z@2l{right}
  ...darkness[(x@0,y@2l),.5[z@2l,z@0] ]{z@0-z@2l}
  ...{down}z@0--(x@1,y@0)--cycle;	% sloped serif
 labels(@0,@1,@2); enddef;

vardef sloped_serif.r(suffix $,$$,@)(expr darkness,jut,drop) =
 pickup crisp.nib; penpos@2(slab-crisp,-90);
 rt x@0=tiny.rt x$r; lft x@1=tiny.lft x$l;
 bot y@1=tiny.bot y$l;
 rt x@2=rt x@0+jut; y@2r=y@1+drop;
 y@0=min(y@2l+bracket,y$$)+epsilon;
 erase fill z@1--bot z@1--(x@2r,bot y@1)--z@2r--cycle; % erase excess at bottom
 filldraw z@1--z@2r--z@2l{left}
  ...darkness[(x@0,y@2l),.5[z@2l,z@0] ]{z@0-z@2l}
  ...{up}z@0--(x@1,y@0)--cycle;	% sloped serif
 labels(@0,@1,@2); enddef;

vardef arm@#(suffix $,$$)(expr darkness,jut) =
	% arm from |z$| to |z$$|
 x@#0=good.x(x$$r-jut); y@#0=y$r;
 if serifs: y@#1=y$l; z@#1=z$$l+whatever*(z$$r-z@#0);
  z@#2=.5[z$l,z@#1];
  filldraw z$$l{z@#1-z$$l}
   ...darkness[z@#1,.5[z@#2,z$$l] ]...z@#2
   ---z$l--z$r--z@#0--z$$r--cycle; % arm and beak
 else: filldraw z$l--z$r--z@#0--z$$r--cycle; fi	% sans-serif arm
 penlabels(@#0,@#1,@#2); enddef;

def bulb(suffix $,$$,$$$) = 
 z$$$r=z$$r;
 path_.l:=z$l{x$$r-x$r,0}...{0,y$$r-y$r}z$$l;
 filldraw path_.l--z$$r{0,y$r-y$$r}...{x$r-x$$r,0}z$r--cycle; % link
 path_.r:=z$$$l{0,y$r-y$$r}..z$$$r{0,y$$r-y$r}; % near-circle
 filldraw subpath(0,xpart(path_.r intersectiontimes path_.l)) of path_.r
  --z$$r{0,y$$r-y$r}..cycle; % bulb
 enddef;

def dot(suffix $,$$) =
 filldraw if square_dots: (x$l,y$$l)--(x$r,y$$l)
   --(x$r,y$$r)--(x$l,y$$r)--cycle	% squarish dot
  else: z$l...z$$l...z$r...z$$r...cycle	% roundish dot
 fi enddef;

vardef diag_in(suffix from,$)(expr sharpness)(suffix $$) =
 pickup tiny.nib; save from_x,y_;
 if y.from>y$: bot else: top fi y_=y$;
 (from_x,y_)=whatever[z.from,z$];
 sharpness[z$,(from_x,y_)]{z$-z.from}
  ...{z$$-z$}z$+sharpness*length(z$-(from_x,y_))*unitvector(z$$-z$) enddef;

vardef diag_out(suffix $)(expr sharpness)(suffix $$,to) =
 pickup tiny.nib; save to_x,y_;
 if y.to>y$: bot else: top fi y_=y$;
 (to_x,y_)=whatever[z$$,z.to];
 z$$-sharpness*length(z$$-(to_x,y_))*unitvector(z$$-z$){z$$-z$}
  ...{z.to-z$$}sharpness[z$$,(to_x,y_)] enddef;

vardef diag_end(suffix from,$)(expr sharp_in,sharp_out)(suffix $$,to) =
 pickup tiny.nib; save from_x,to_x,y_;
 if y.from>y$: bot else: top fi y_=y$;
 (from_x,y_)=whatever[z.from,z$]; (to_x,y_)=whatever[z$$,z.to];
 sharp_in[z$,(from_x,y_)]{z$-z.from}
  ...z$+sharp_in*length(z$-(from_x,y_))*unitvector(z$$-z$){z$$-z$}
  --z$$-sharp_out*length(z$$-(to_x,y_))*unitvector(z$$-z$){z$$-z$}
  ...{z.to-z$$}sharp_out[z$$,(to_x,y_)] enddef;

def prime_points_inside(suffix $,$$) = 
 theta_:=angle(z$r-z$l);
 penpos$'(whatever,theta_);
 if y$$>y$: z$'=(0,pen_top) rotated theta_ + whatever[z$l,z$r];
  theta_:=angle(z$$-z$)-90;
 else: z$'=(0,pen_bot) rotated theta_ + whatever[z$l,z$r];
  theta_:=angle(z$$-z$)+90; fi
 z$'l+(pen_lft,0) rotated theta_=z$l+whatever*(z$-z$$);
 z$'r+(pen_rt,0) rotated theta_=z$r+whatever*(z$-z$$);
 enddef;

vardef parallel_pos(expr d,u,v,w) = % point at distance $d$ from $u$,
	% on the line through $w$ that's parallel to |u..v|
 pair p_; p_=w+whatever*(u-v)=u+whatever*(u-v) rotated 90;
 numeric d_; d_=length(u-p_);	% distance from $w$ to |u..v|
 if d_≥d: p_ else: p_+(d+-+d_)*unitvector(v-u) fi enddef;

vardef diag_ratio(expr a,b,y,c) =
	% the value $\alpha=(x++y)/y$ such that $ax+b\alpha=c$,
	% assuming that $a>\vert b/y\vert$
 numeric a_,b_; b_=b/y; a_=a*a-b_*b_;
 (a*(c++y*sqrt a_)-b_*c)/a_/y enddef;
%vardef solve_diag(expr a,b,y,c) =
%	% the root of $ax+b(x++y)/y=c$, assuming that $a>\vert b/y\vert$
% numeric a_,b_; b_=b/y; a_=a*a-b_*b_;
% (a*c-b_*(c++y*sqrt a_))/a_ enddef;

def f_stroke(suffix $,$$,@,left_serif,right_serif)(expr left_jut,right_jut)=
 pickup tiny.nib; bot y$=0;
 penpos@0(x$r-x$l,0); x@0l=x$l; top y@0=x_height;
 filldraw stroke z$e..z@0e;	% stem
 pickup fine.nib; penpos@0'(x$r-x$l-round(stem_corr)+tiny-teeny,180);
 y@0'=y@0; lft x@0'r=tiny.lft x$l;
 penpos@1(x@0'l-x@0'r,180); x@1=x@0'; y@1+.5vair=.5[x_height,h];
 penpos@2(vair-teeny,90); top y@2r=h+oo;
 if serifs: x@2=.6[x@1,x$$r]; (x@,y@2r)=whatever[z@2l,z@1l]; x@2r:=x@;
  penpos@3(hair-teeny,0); bulb(@2,@3,$$);	% bulb
  filldraw stroke z@0'e..z@1e & super_arc.e(@1,@2);	% arc
  cup_serif($,@0,left_serif,right_serif,1/3,left_jut,1/3,right_jut); % serif
 else: x@2=.6[x@1,x$$]; y@1l:=1/3[y@1l,y@2l];
  filldraw stroke z@0'e--z@1e & super_arc.e(@1,@2)
   & z@2e{right}..tension atleast .9 and 1..z$$e; fi	% arc and terminal
 penlabels(@0,@1,@2); enddef;

def h_stroke(suffix $,@,@@,$$) =
 penpos$$(x@@r-x@@l,0); x$$=x@@; bot y$$=0; y@@=1/3[bar_height,x_height];
 penpos$''(x$r-x$l,0); x$''=x$; y$''=1/8[bar_height,x_height];
 filldraw stroke z$''e..z$e;	% thicken the lower left stem
 pickup fine.nib; penpos@0(2epsilon,180);
 rt x@0l=tiny.rt x$r; y@0=y$'';
 penpos@1(vair-fine,90); penpos@@'(x@@r-x@@l+tiny-fine,0); z@@'=z@@;
 x@1=.5[rt x@0l,rt x@@'r]; top y@1r=x_height+oo;
 (x@,y@1l)=whatever[z@1r,z@0l]; x@1l:=x@;
 filldraw stroke z@0e{up}...{right}z@1e
  &{{interim superness:=hein_super;
   pulled_super_arc.e(@1,@@')(superpull)}};	% arch
 pickup tiny.nib; filldraw stroke z@@e..z$$e;	% right stem
 labels(@0); penlabels(@1); enddef;

def normal_adjust_fit(expr left_adjustment,right_adjustment) =
 l:=-round(left_adjustment*hppp)-letter_fit;
	% double rounding makes letter spacing more consistent
 interim xoffset:=-l;
 charwd:=charwd+2letter_fit#+left_adjustment+right_adjustment;
 r:=l+round(charwd*hppp);
 w:=r-round(right_adjustment*hppp)-letter_fit;
 enddef;

def mono_adjust_fit(expr left_adjustment,right_adjustment) =
 numeric expansion_factor;
 mono_charwd#=2letter_fit#
   +expansion_factor*(charwd+left_adjustment+right_adjustment);
 forsuffixes $=u,jut,cap_jut,beak_jut,apex_corr:
   $:=$.#*expansion_factor*hppp; endfor
 l:=-round(left_adjustment*expansion_factor*hppp)-letter_fit;
 interim xoffset:=-l;
 r:=l+mono_charwd;
 w:=r-round(right_adjustment*expansion_factor*hppp)-letter_fit;
 charwd:=mono_charwd#; charic:=mono_charic#;
 enddef;

extra_endchar:=extra_endchar&"w:=r-l;";

def ignore_math_fit(expr left_adjustment,right_adjustment) = enddef;
def do_math_fit(expr left_adjustment,right_adjustment) = % not tested!
 l:=l-round(left_adjustment*hppp);
 charwd:=charwd+left_adjustment+right_adjustment;
 r:=l+round(charwd);
 charic:=charic-right_adjustment;
 if charic<0: charic:=0; fi enddef;

def font_setup = designsize:=fontsize#;
 define_pixels(u,width_adj,serif_fit,cap_serif_fit,
  bar_height,cup,bracket,beak_jut,stem_corr,vair_corr,apex_corr);
 define_blacker_pixels(ess,cap_ess,jut,cap_jut,beak,notch_cut,cap_notch_cut);
 define_whole_pixels(letter_fit,fine,crisp,teeny,tiny);
 define_whole_vertical_pixels(body_height,asc_height,
  cap_height,fig_height,x_height,comma_depth,desc_depth,serif_drop);
 define_whole_blacker_pixels(hair,vair,bar,slab,stem,curve,
  flare,dot_size,cap_hair,cap_bar,cap_band,cap_stem,cap_curve);
 define_corrected_pixels(o,apex_o);
 forsuffixes $=hair,stem,cap_stem:
  fudged$.#:=fudge*$.#; fudged$:=round(fudged$.#*hppp+blacker);
  forever: exitif fudged$>.9fudge*$; fudged$:=fudged$+1; endfor endfor
 rule_thickness:=ceiling(rule_thickness#*hppp);
 math_axis:=.5vround(2math_axis#*hppp);
 oo:=round(.5o#*hppp*o_correction)+epsilon;
 if known Xerox_world: font_family fontidentifier; fi
 if monospace: let adjust_fit=mono_adjust_fit;
  def mfudged=fudged enddef;
  mono_charic#:=body_height#*slant;
  if mono_charic#<0: mono_charic#:=0; fi
  mono_charwd#:=9u#+2letter_fit#; define_whole_pixels(mono_charwd);
 else: let adjust_fit=normal_adjust_fit;
  def mfudged= enddef; fi
 if math_fitting: let math_fit=do_math_fit
 else: let math_fit=ignore_math_fit fi;
 lowres_fix(stem,curve,flare) 1.25;
 lowres_fix(stem,curve) 1.1;
 lowres_fix(cap_stem,cap_stem,cap_curve) 1.1;
 lowres_fix(hair,cap_hair) 1.1;
 lowres_fix(cap_band,cap_bar,bar,slab) 1.1;
 stem':=round(stem-stem_corr); cap_stem':=round(cap_stem-stem_corr);
 stem'':=round(stem-2stem_corr); cap_stem'':=round(cap_stem-2stem_corr);
 vair':=round(vair+vair_corr);
 more_super:=max(superness,sqrt .77superness);
 hein_super:=max(superness,sqrt .81225258superness); % that's $2↑{-.3}$
 forsuffixes $=fine,crisp,tiny,teeny:
  if $>fudged.hair: $:=fudged.hair; fi
  $.breadth:=$;
  pickup if $=0: nullpen
  else: pencircle scaled $; $:=$-3epsilon fi;
  $.nib:=savepen;
  forsuffixes $$=rt,lft,bot,top: shiftdef($.$$,$$ 0); endfor endfor
 currenttransform:=identity slanted slant yscaled aspect_ratio;
 body_depth:=desc_depth+body_height-asc_height;
 enddef;

def shiftdef(suffix $)(expr delta) =
 vardef $ primary x = x+delta enddef enddef;

% this for efficiency only; worth it? (I guess it goes into PLAIN someday)
vardef penpos@#(expr b,d) =
 (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
 x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;

def makebox(text rule) =
 for y=0,asc_height,body_height,x_height,bar_height,-desc_depth,-body_depth:
  rule(↑(l,y),↑(r,y)); endfor % horizontals
 for x=l,r:   rule(↑(x,-body_depth),↑(x,body_height)); endfor % verticals
 for x=u*(1+floor(l/u)) step u until r-1:
  rule(↑(x,-body_depth),↑(x,body_height)); endfor % more verticals
 if charic≠0: rule((r+charic*pt,h!),(r+charic*pt,.5h!)); fi % italic correction
 enddef;
def maketicks(text rule) =
 for y=0,h!,-d!: rule((l,y),(l+10,y)); rule((r-10,y),(r,y)); endfor % horizontals
 for x=l,r: rule((x,10-d!),(x,-d!)); rule((x,h!-10),(x,h!)); endfor % verticals
 enddef;
rulepen:=pensquare;

vardef stroke text t =
 forsuffixes e = l,r: path_.e:=t; endfor
 if cycle path_.l: errmessage "Beware: `stroke' isn't intended for cycles"; fi
 path_.l -- reverse path_.r -- cycle enddef;

vardef super_arc.r(suffix $,$$) = % outside of super-ellipse
 pair center,corner;
 if y$=y$r: center=(x$$r,y$r); corner=(x$r,y$$r);
 else: center=(x$r,y$$r); corner=(x$$r,y$r); fi
 z$.r{corner-z$.r}...superness[center,corner]{z$$.r-z$.r}
  hide(makelabel("r",superness[center,corner]))	% temporary
  ...{z$$.r-corner}z$$.r enddef;

vardef super_arc.l(suffix $,$$) = % inside of super-ellipse
 pair center,corner;
 if y$=y$r: center=(x$$l,y$l); corner=(x$l,y$$l);
 else: center=(x$l,y$$l); corner=(x$$l,y$l); fi
 z$l{corner-z$l}...superness[center,corner]{z$$l-z$l}
  hide(makelabel("l",superness[center,corner])) % temporary
  ...{z$$l-corner}z$$l enddef;

vardef pulled_super_arc.r(suffix $,$$)(expr superpull) =
 pair center,corner;
 if y$=y$r: center=(x$$r,y$r); corner=(x$r,y$$r);
 else: center=(x$r,y$$r); corner=(x$$r,y$r); fi
 z$r{corner-z$r}...superness[center,corner]{z$$r-z$r}
  hide(makelabel("r",superness[center,corner])) % temporary
  ...{z$$r-corner}z$$r enddef;

vardef pulled_super_arc.l(suffix $,$$)(expr superpull) =
 pair center,corner,outer_point;
 if y$=y$r: center=(x$$l,y$l); corner=(x$l,y$$l);
  outer_point=superness[(x$$r,y$r),(x$r,y$$r)];
 else: center=(x$l,y$$l); corner=(x$$l,y$l);
  outer_point=superness[(x$r,y$$r),(x$$r,y$r)]; fi
 z$l{corner-z$l}
  ...superpull[superness[center,corner],outer_point]{z$$l-z$l}
  hide(makelabel("l",superpull[superness[center,corner],outer_point])) % temporary
  ...{z$$l-corner}z$$l enddef;

let {{=begingroup; let }}=endgroup;

vardef ic# = charic enddef;

let semi_ = ;; let colon_ = :; let endchar_ = endchar;
def iff expr b = if b:let next_=use_it else:let next_=lose_it fi; next_ enddef;
def use_it = let : = restore_colon; enddef;
def restore_colon = let : = colon_; enddef;
def lose_it = let endchar=fi; let ;=restore_endchar semi_ if false enddef;
def restore_endchar=let ;=semi_; let endchar=endchar_; enddef;
def always_iff expr b = use_it enddef;
% Computer Modern Roman 10 point
if unknown cmbase: input cmbase fi

font_identifier:="CMR"; font_size 10pt#;

u#:=20/36pt#;			% unit width
width_adj#:=0pt#;		% width adjustment for certain characters
serif_fit#:=0pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=5/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=0pt#;		% extra space added to all sidebars

body_height#:=270/36pt#;	% height of tallest characters
asc_height#:=250/36pt#;		% height of lowercase ascenders
cap_height#:=246/36pt#;		% height of caps
fig_height#:=232/36pt#;		% height of numerals
x_height#:=155/36pt#;		% height of lowercase without ascenders
math_axis#:=90/36pt#;		% axis of symmetry for math symbols
bar_height#:=87/36pt#;		% height of crossbar in lowercase e
comma_depth#:=70/36pt#;		% depth of comma below baseline
desc_depth#:=70/36pt#;		% depth of lowercase descenders

crisp#:=0pt#;			% diameter of serif corners
tiny#:=8/36pt#;			% diameter of rounded corners
fine#:=7/36pt#;			% diameter of sharply rounded corners
thin_join#:=7/36pt#;		% width of extrafine details
hair#:=9/36pt#;			% lowercase hairline breadth
stem#:=25/36pt#;		% lowercase stem breadth
curve#:=30/36pt#;		% lowercase curve breadth
ess#:=27/36pt#;			% breadth in middle of lowercase s
flare#:=33/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=38/36pt#;		% diameter of dots
cap_hair#:=11/36pt#;		% uppercase hairline breadth
cap_stem#:=32/36pt#;		% uppercase stem breadth
cap_curve#:=37/36pt#;		% uppercase curve breadth
cap_ess#:=35/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=.4pt#;		% thickness of lines in math symbols

cup#:=1/36pt#;			% amount erased at top or bottom of serifs
bracket#:=20/36pt#;		% vertical distance from serif base to tangent
jut#:=28/36pt#;			% protrusion of lowercase serifs
cap_jut#:=37/36pt#;		% protrusion of uppercase serifs
beak_jut#:=10/36pt#;		% horizontal protrusion of beak serifs
beak#:=70/36pt#;		% vertical protrusion of beak serifs
vair#:=8/36pt#;			% vertical diameter of hairlines
notch_cut#:=10pt#;		% maximum breadth above or below notches
bar#:=11/36pt#;			% lowercase bar thickness
slab#:=11/36pt#;		% serif and arm thickness
cap_bar#:=11/36pt#;		% uppercase bar thickness
cap_band#:=11/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=10pt#;		% max breadth above/below uppercase notches
serif_drop#:=4/36pt#;		% vertical drop of sloped serifs
stem_corr#:=1/36pt#;		% for small refinements of stem breadth
vair_corr#:=1/36pt#;		% for small refinements of hairline height
apex_corr#:=0pt#;		% extra width at diagonal junctions

o#:=8/36pt#;			% amount of overshoot for curves
apex_o#:=12/36pt#;		% amount of overshoot for diagonal junctions

slant:=0;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=1;			% factor applied to weights of heavy characters
math_spread:=0;			% extra openness of math symbols
superness:=1/sqrt2;		% parameter for superellipses
superpull:=1/6;			% extra openness inside bowls
beak_darkness:=11/30;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=false;		% should dots be square?
hefty:=false;			% should we try hard not to be overweight?
serifs:=true;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=false;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font
% Computer Modern Sans Serif Bold Extended 10 pt
if unknown cmbase: input cmbase fi

font_identifier:="CMSSBX"; font_size 10pt#;

u#:=22/36pt#;			% unit width
width_adj#:=22/36pt#;		% width adjustment for certain characters
serif_fit#:=-9/36pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=-11/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=0pt#;		% extra space added to all sidebars

body_height#:=270/36pt#;	% height of tallest characters
asc_height#:=250/36pt#;		% height of lowercase ascenders
cap_height#:=250/36pt#;		% height of caps
fig_height#:=250/36pt#;		% height of numerals
x_height#:=165/36pt#;		% height of lowercase without ascenders
math_axis#:=90/36pt#;		% axis of symmetry for math symbols
bar_height#:=90/36pt#;		% height of crossbar in lowercase e
comma_depth#:=38/36pt#;		% depth of comma below baseline
desc_depth#:=70/36pt#;		% depth of lowercase descenders

crisp#:=26/36pt#;		% diameter of serif corners
tiny#:=26/36pt#;		% diameter of rounded corners
fine#:=9/36pt#;			% diameter of sharply rounded corners
thin_join#:=9/36pt#;		% width of extrafine details
hair#:=49/36pt#;		% lowercase hairline breadth
stem#:=49/36pt#;		% lowercase stem breadth
curve#:=49/36pt#;		% lowercase curve breadth
ess#:=45/36pt#;			% breadth in middle of lowercase s
flare#:=40/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=47/36pt#;		% diameter of dots
cap_hair#:=49/36pt#;		% uppercase hairline breadth
cap_stem#:=53/36pt#;		% uppercase stem breadth
cap_curve#:=53/36pt#;		% uppercase curve breadth
cap_ess#:=51/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=30/36pt#;	% thickness of lines in math symbols

cup#:=0pt#;			% amount erased at top or bottom of serifs
bracket#:=0pt#;			% vertical distance from serif base to tangent
jut#:=0pt#;			% protrusion of lowercase serifs
cap_jut#:=0pt#;			% protrusion of uppercase serifs
beak_jut#:=0pt#;		% horizontal protrusion of beak serifs
beak#:=1.5/36pt#;		% vertical protrusion of beak serifs
vair#:=26/36pt#;		% vertical diameter of hairlines
notch_cut#:=49/36pt#;		% maximum breadth above or below notches
bar#:=26/36pt#;			% lowercase bar thickness
slab#:=36/36pt#;		% serif and arm thickness
cap_bar#:=34/36pt#;		% uppercase bar thickness
cap_band#:=31/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=49/36pt#;	% max breadth above/below uppercase notches
serif_drop#:=2/36pt#;		% vertical drop of sloped serifs
stem_corr#:=1/36pt#;		% for small refinements of stem breadth
vair_corr#:=2/36pt#;		% for small refinements of hairline height
apex_corr#:=18/36pt#;		% extra width at diagonal junctions

o#:=8/36pt#;			% amount of overshoot for curves
apex_o#:=0pt#;			% amount of overshoot for diagonal junctions

slant:=0;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=.88;			% factor applied to weights of heavy characters
math_spread:=.5;			% extra openness of math symbols
superness:=3/4;			% parameter for superellipses
superpull:=1/18;		% extra openness inside bowls
beak_darkness:=0;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=true;		% should dots be square?
hefty:=true;			% should we try hard not to be overweight?
serifs:=false;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=false;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font
% Computer Modern Typewriter Text for use with 10 point
if unknown cmbase: input cmbase fi

font_identifier:="CMTT"; font_size 10pt#;

u#:=21/36pt#;			% unit width
width_adj#:=0pt#;		% width adjustment for certain characters
serif_fit#:=0pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=0pt#;		% extra sidebar near uppercase serifs
letter_fit#:=0pt#;		% extra space added to all sidebars

body_height#:=250/36pt#;	% height of tallest characters
asc_height#:=220/36pt#;		% height of lowercase ascenders
cap_height#:=220/36pt#;		% height of caps
fig_height#:=220/36pt#;		% height of numerals
x_height#:=155/36pt#;		% height of lowercase without ascenders
math_axis#:=110/36pt#;		% axis of symmetry for math symbols
bar_height#:=79/36pt#;		% height of crossbar in lowercase e
comma_depth#:=40/36pt#;		% depth of comma below baseline
desc_depth#:=80/36pt#;		% depth of lowercase descenders

crisp#:=22/36pt#;		% diameter of serif corners
tiny#:=22/36pt#;		% diameter of rounded corners
fine#:=21/36pt#;		% diameter of sharply rounded corners
thin_join#:=21/36pt#;		% width of extrafine details
hair#:=25/36pt#;		% lowercase hairline breadth
stem#:=25/36pt#;		% lowercase stem breadth
curve#:=25/36pt#;		% lowercase curve breadth
ess#:=22/36pt#;			% breadth in middle of lowercase s
flare#:=32/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=36/36pt#;		% diameter of dots
cap_hair#:=25/36pt#;		% uppercase hairline breadth
cap_stem#:=25/36pt#;		% uppercase stem breadth
cap_curve#:=25/36pt#;		% uppercase curve breadth
cap_ess#:=25/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=25/36pt#;	% thickness of lines in math symbols

cup#:=0pt#;			% amount erased at top or bottom of serifs
bracket#:=0pt#;			% vertical distance from serif base to tangent
jut#:=34/36pt#;			% protrusion of lowercase serifs
cap_jut#:=34/36pt#;		% protrusion of uppercase serifs
beak_jut#:=0pt#;		% horizontal protrusion of beak serifs
beak#:=34/36pt#;		% vertical protrusion of beak serifs
vair#:=22/36pt#;		% vertical diameter of hairlines
notch_cut#:=25/36pt#;		% maximum breadth above or below notches
bar#:=22/36pt#;			% lowercase bar thickness
slab#:=22/36pt#;		% serif and arm thickness
cap_bar#:=22/36pt#;		% uppercase bar thickness
cap_band#:=22/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=25/36pt#;	% max breadth above/below uppercase notches
serif_drop#:=0pt#;		% vertical drop of sloped serifs
stem_corr#:=0pt#;		% for small refinements of stem breadth
vair_corr#:=0pt#;		% for small refinements of hairline height
apex_corr#:=10/36pt#;		% extra width at diagonal junctions

o#:=4/36pt#;			% amount of overshoot for curves
apex_o#:=6/36pt#;		% amount of overshoot for diagonal junctions

slant:=0;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=0.81;			% factor applied to weights of heavy characters
math_spread:=-1;		% extra openness of math symbols
superness:=1/sqrt2;		% parameter for superellipses
superpull:=0;			% extra openness inside bowls
beak_darkness:=0;		% fraction of triangle inside beak serifs
ligs:=0;			% level of ligatures to be included

square_dots:=false;		% should dots be square?
hefty:=true;			% should we try hard not to be overweight?
serifs:=true;			% should serifs and bulbs be attached?
monospace:=true;		% should all characters have the same width?
variant_g:=false;		% should an italic-style g be used?
low_asterisk:=true;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font
% Computer Modern Bold Extended Roman 10 point
if unknown cmbase: input cmbase fi

font_identifier:="CMBX"; font_size 10pt#;

u#:=23/36pt#;			% unit width
width_adj#:=11/36pt#;		% width adjustment for certain characters
serif_fit#:=0pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=7/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=0pt#;		% extra space added to all sidebars

body_height#:=270/36pt#;	% height of tallest characters
asc_height#:=250/36pt#;		% height of lowercase ascenders
cap_height#:=247/36pt#;		% height of caps
fig_height#:=232/36pt#;		% height of numerals
x_height#:=160/36pt#;		% height of lowercase without ascenders
math_axis#:=90/36pt#;		% axis of symmetry for math symbols
bar_height#:=80/36pt#;		% height of crossbar in lowercase e
comma_depth#:=70/36pt#;		% depth of comma below baseline
desc_depth#:=70/36pt#;		% depth of lowercase descenders

crisp#:=0pt#;			% diameter of serif corners
tiny#:=13/36pt#;		% diameter of rounded corners
fine#:=10/36pt#;		% diameter of sharply rounded corners
thin_join#:=10/36pt#;		% width of extrafine details
hair#:=17/36pt#;		% lowercase hairline breadth
stem#:=41/36pt#;		% lowercase stem breadth
curve#:=46/36pt#;		% lowercase curve breadth
ess#:=38/36pt#;			% breadth in middle of lowercase s
flare#:=45/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=56/36pt#;		% diameter of dots
cap_hair#:=19/36pt#;		% uppercase hairline breadth
cap_stem#:=51/36pt#;		% uppercase stem breadth
cap_curve#:=55/36pt#;		% uppercase curve breadth
cap_ess#:=53/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=.6pt#;		% thickness of lines in math symbols

cup#:=2/36pt#;			% amount erased at top or bottom of serifs
bracket#:=10/36pt#;		% vertical distance from serif base to tangent
jut#:=25/36pt#;			% protrusion of lowercase serifs
cap_jut#:=39/36pt#;		% protrusion of uppercase serifs
beak_jut#:=11/36pt#;		% horizontal protrusion of beak serifs
beak#:=70/36pt#;		% vertical protrusion of beak serifs
vair#:=13/36pt#;		% vertical diameter of hairlines
notch_cut#:=10pt#;		% maximum breadth above or below notches
bar#:=17/36pt#;			% lowercase bar thickness
slab#:=17/36pt#;		% serif and arm thickness
cap_bar#:=17/36pt#;		% uppercase bar thickness
cap_band#:=17/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=10pt#;		% max breadth above/below uppercase notches
serif_drop#:=3/36pt#;		% vertical drop of sloped serifs
stem_corr#:=2/36pt#;		% for small refinements of stem breadth
vair_corr#:=1.5/36pt#;		% for small refinements of hairline height
apex_corr#:=0pt#;		% extra width at diagonal junctions

o#:=6/36pt#;			% amount of overshoot for curves
apex_o#:=9/36pt#;		% amount of overshoot for diagonal junctions

slant:=0;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=1;			% factor applied to weights of heavy characters
math_spread:=.5;		% extra openness of math symbols
superness:=8/11;		% parameter for superellipses
superpull:=1/8;			% extra openness inside bowls
beak_darkness:=.4;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=false;		% should dots be square?
hefty:=false;			% should we try hard not to be overweight?
serifs:=true;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=false;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font
% Computer Modern Bold Extended Roman 5 point
if unknown cmbase: input cmbase fi

font_identifier:="CMBX"; font_size 5pt#;

u#:=14.5/36pt#;			% unit width
width_adj#:=7/36pt#;		% width adjustment for certain characters
serif_fit#:=0pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=3/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=11/36pt#;		% extra space added to all sidebars

body_height#:=135/36pt#;	% height of tallest characters
asc_height#:=125/36pt#;		% height of lowercase ascenders
cap_height#:=123.5/36pt#;	% height of caps
fig_height#:=116/36pt#;		% height of numerals
x_height#:=80/36pt#;		% height of lowercase without ascenders
math_axis#:=45/36pt#;		% axis of symmetry for math symbols
bar_height#:=40/36pt#;		% height of crossbar in lowercase e
comma_depth#:=35/36pt#;		% depth of comma below baseline
desc_depth#:=35/36pt#;		% depth of lowercase descenders

crisp#:=0pt#;			% diameter of serif corners
tiny#:=9/36pt#;			% diameter of rounded corners
fine#:=8/36pt#;			% diameter of sharply rounded corners
thin_join#:=8/36pt#;		% width of extrafine details
hair#:=14/36pt#;		% lowercase hairline breadth
stem#:=22/36pt#;		% lowercase stem breadth
curve#:=25/36pt#;		% lowercase curve breadth
ess#:=19/36pt#;			% breadth in middle of lowercase s
flare#:=26/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=31/36pt#;		% diameter of dots
cap_hair#:=16/36pt#;		% uppercase hairline breadth
cap_stem#:=28/36pt#;		% uppercase stem breadth
cap_curve#:=31/36pt#;		% uppercase curve breadth
cap_ess#:=29/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=.43pt#;	% thickness of lines in math symbols

cup#:=1.5/36pt#;		% amount erased at top or bottom of serifs
bracket#:=5/36pt#;		% vertical distance from serif base to tangent
jut#:=13/36pt#;			% protrusion of lowercase serifs
cap_jut#:=19/36pt#;		% protrusion of uppercase serifs
beak_jut#:=7pt#;		% horizontal protrusion of beak serifs
beak#:=35/36pt#;		% vertical protrusion of beak serifs
vair#:=9/36pt#;			% vertical diameter of hairlines
notch_cut#:=5pt#;		% maximum breadth above or below notches
bar#:=12/36pt#;			% lowercase bar thickness
slab#:=12/36pt#;		% serif and arm thickness
cap_bar#:=12/36pt#;		% uppercase bar thickness
cap_band#:=12/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=10pt#;		% max breadth above/below uppercase notches
serif_drop#:=1.5/36pt#;		% vertical drop of sloped serifs
stem_corr#:=1.5/36pt#;		% for small refinements of stem breadth
vair_corr#:=1/36pt#;		% for small refinements of hairline height
apex_corr#:=0pt#;		% extra width at diagonal junctions

o#:=3/36pt#;			% amount of overshoot for curves
apex_o#:=4.5/36pt#;		% amount of overshoot for diagonal junctions

slant:=0;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=1;			% factor applied to weights of heavy characters
math_spread:=1.5;		% extra openness of math symbols
superness:=8/11;		% parameter for superellipses
superpull:=1/8;			% extra openness inside bowls
beak_darkness:=.4;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=false;		% should dots be square?
hefty:=false;			% should we try hard not to be overweight?
serifs:=true;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=false;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font
% Computer Modern Sans Serif Demibold Condensed 10 pt
if unknown cmbase: input cmbase fi

font_identifier:="CMSSDC"; font_size 10pt#;

u#:=19/36pt#;			% unit width
width_adj#:=15/36pt#;		% width adjustment for certain characters
serif_fit#:=-8/36pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=-9/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=0pt#;		% extra space added to all sidebars

body_height#:=270/36pt#;	% height of tallest characters
asc_height#:=250/36pt#;		% height of lowercase ascenders
cap_height#:=250/36pt#;		% height of caps
fig_height#:=250/36pt#;		% height of numerals
x_height#:=170/36pt#;		% height of lowercase without ascenders
math_axis#:=95/36pt#;		% axis of symmetry for math symbols
bar_height#:=95/36pt#;		% height of crossbar in lowercase e
comma_depth#:=30/36pt#;		% depth of comma below baseline
desc_depth#:=60/36pt#;		% depth of lowercase descenders

crisp#:=23/36pt#;		% diameter of serif corners
tiny#:=23/36pt#;		% diameter of rounded corners
fine#:=8/36pt#;			% diameter of sharply rounded corners
thin_join#:=8/36pt#;		% width of extrafine details
hair#:=40/36pt#;		% lowercase hairline breadth
stem#:=40/36pt#;		% lowercase stem breadth
curve#:=40/36pt#;		% lowercase curve breadth
ess#:=37/36pt#;			% breadth in middle of lowercase s
flare#:=31/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=38/36pt#;		% diameter of dots
cap_hair#:=40/36pt#;		% uppercase hairline breadth
cap_stem#:=44/36pt#;		% uppercase stem breadth
cap_curve#:=44/36pt#;		% uppercase curve breadth
cap_ess#:=42/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=25/36pt#;	% thickness of lines in math symbols

cup#:=0pt#;			% amount erased at top or bottom of serifs
bracket#:=0pt#;			% vertical distance from serif base to tangent
jut#:=0pt#;			% protrusion of lowercase serifs
cap_jut#:=0pt#;			% protrusion of uppercase serifs
beak_jut#:=0pt#;		% horizontal protrusion of beak serifs
beak#:=1.5/36pt#;		% vertical protrusion of beak serifs
vair#:=23/36pt#;		% vertical diameter of hairlines
notch_cut#:=40/36pt#;		% maximum breadth above or below notches
bar#:=23/36pt#;			% lowercase bar thickness
slab#:=31/36pt#;		% serif and arm thickness
cap_bar#:=29/36pt#;		% uppercase bar thickness
cap_band#:=27/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=40/36pt#;	% max breadth above/below uppercase notches
serif_drop#:=2/36pt#;		% vertical drop of sloped serifs
stem_corr#:=1/36pt#;		% for small refinements of stem breadth
vair_corr#:=2/36pt#;		% for small refinements of hairline height
apex_corr#:=14/36pt#;		% extra width at diagonal junctions

o#:=7/36pt#;			% amount of overshoot for curves
apex_o#:=0pt#;			% amount of overshoot for diagonal junctions

slant:=0;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=.91;			% factor applied to weights of heavy characters
math_spread:=.3;		% extra openness of math symbols
superness:=3/4;			% parameter for superellipses
superpull:=1/18;		% extra openness inside bowls
beak_darkness:=0;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=true;		% should dots be square?
hefty:=true;			% should we try hard not to be overweight?
serifs:=false;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=true;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font
% Computer Modern Sans Serif Quotation Style Slanted 8 point
if unknown cmbase: input cmbase fi

font_identifier:="CMSSQI"; font_size 8pt#;

u#:=20/36pt#;			% unit width
width_adj#:=2/36pt#;		% width adjustment for certain characters
serif_fit#:=-10/36pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=-14/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=0pt#;		% extra space added to all sidebars

body_height#:=220/36pt#;	% height of tallest characters
asc_height#:=200/36pt#;		% height of lowercase ascenders
cap_height#:=197/36pt#;		% height of caps
fig_height#:=190/36pt#;		% height of numerals
x_height#:=150/36pt#;		% height of lowercase without ascenders
math_axis#:=80/36pt#;		% axis of symmetry for math symbols
bar_height#:=74/36pt#;		% height of crossbar in lowercase e
comma_depth#:=40/36pt#;		% depth of comma below baseline
desc_depth#:=40/36pt#;		% depth of lowercase descenders

crisp#:=18/36pt#;		% diameter of serif corners
tiny#:=18/36pt#;		% diameter of rounded corners
fine#:=8/36pt#;			% diameter of sharply rounded corners
thin_join#:=8/36pt#;		% width of extrafine details
hair#:=23/36pt#;		% lowercase hairline breadth
stem#:=23/36pt#;		% lowercase stem breadth
curve#:=23/36pt#;		% lowercase curve breadth
ess#:=19/36pt#;			% breadth in middle of lowercase s
flare#:=21/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=28/36pt#;		% diameter of dots
cap_hair#:=23/36pt#;		% uppercase hairline breadth
cap_stem#:=27/36pt#;		% uppercase stem breadth
cap_curve#:=27/36pt#;		% uppercase curve breadth
cap_ess#:=27/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=20/36pt#;	% thickness of lines in math symbols

cup#:=0pt#;			% amount erased at top or bottom of serifs
bracket#:=0pt#;			% vertical distance from serif base to tangent
jut#:=0pt#;			% protrusion of lowercase serifs
cap_jut#:=0pt#;			% protrusion of uppercase serifs
beak_jut#:=0pt#;		% horizontal protrusion of beak serifs
beak#:=0pt#;			% vertical protrusion of beak serifs
vair#:=18/36pt#;		% vertical diameter of hairlines
notch_cut#:=23/36pt#;		% maximum breadth above or below notches
bar#:=18/36pt#;			% lowercase bar thickness
slab#:=19/36pt#;		% serif and arm thickness
cap_bar#:=19/36pt#;		% uppercase bar thickness
cap_band#:=19/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=23/36pt#;	% max breadth above/below uppercase notches
serif_drop#:=0pt#;		% vertical drop of sloped serifs
stem_corr#:=.5/36pt#;		% for small refinements of stem breadth
vair_corr#:=.5/36pt#;		% for small refinements of hairline height
apex_corr#:=4/36pt#;		% extra width at diagonal junctions

o#:=6/36pt#;			% amount of overshoot for curves
apex_o#:=2/36pt#;		% amount of overshoot for diagonal junctions

slant:=2/7;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=.95;			% factor applied to weights of heavy characters
math_spread:=0;			% extra openness of math symbols
superness:=1/sqrt2;		% parameter for superellipses
superpull:=1/10;		% extra openness inside bowls
beak_darkness:=0;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=true;		% should dots be square?
hefty:=true;			% should we try hard not to be overweight?
serifs:=false;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=true;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font
% Computer Modern Text Italic 10 point
if unknown cmbase: input cmbase fi

font_identifier:="CMTI"; font_size 10pt#;

u#:=18.4/36pt#;			% unit width
width_adj#:=0pt#;		% width adjustment for certain characters
serif_fit#:=0pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=5/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=9/36pt#;		% extra space added to all sidebars

body_height#:=270/36pt#;	% height of tallest characters
asc_height#:=250/36pt#;		% height of lowercase ascenders
cap_height#:=246/36pt#;		% height of caps
fig_height#:=232/36pt#;		% height of numerals
x_height#:=155/36pt#;		% height of lowercase without ascenders
math_axis#:=90/36pt#;		% axis of symmetry for math symbols
bar_height#:=87/36pt#;		% height of crossbar in lowercase e
comma_depth#:=70/36pt#;		% depth of comma below baseline
desc_depth#:=70/36pt#;		% depth of lowercase descenders

crisp#:=8/36pt#;		% diameter of serif corners
tiny#:=8/36pt#;			% diameter of rounded corners
fine#:=7/36pt#;			% diameter of sharply rounded corners
thin_join#:=7/36pt#;		% width of extrafine details
hair#:=11/36pt#;		% lowercase hairline breadth
stem#:=23/36pt#;		% lowercase stem breadth
curve#:=28/36pt#;		% lowercase curve breadth
ess#:=27/36pt#;			% breadth in middle of lowercase s
flare#:=31/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=38/36pt#;		% diameter of dots
cap_hair#:=11/36pt#;		% uppercase hairline breadth
cap_stem#:=29/36pt#;		% uppercase stem breadth
cap_curve#:=34/36pt#;		% uppercase curve breadth
cap_ess#:=31/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=.4pt#;		% thickness of lines in math symbols

cup#:=1/36pt#;			% amount erased at top or bottom of serifs
bracket#:=20/36pt#;		% vertical distance from serif base to tangent
jut#:=26/36pt#;			% protrusion of lowercase serifs
cap_jut#:=34/36pt#;		% protrusion of uppercase serifs
beak_jut#:=9/36pt#;		% horizontal protrusion of beak serifs
beak#:=70/36pt#;		% vertical protrusion of beak serifs
vair#:=8/36pt#;			% vertical diameter of hairlines
notch_cut#:=10pt#;		% maximum breadth above or below notches
bar#:=11/36pt#;			% lowercase bar thickness
slab#:=11/36pt#;		% serif and arm thickness
cap_bar#:=11/36pt#;		% uppercase bar thickness
cap_band#:=11/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=10pt#;		% max breadth above/below uppercase notches
serif_drop#:=4/36pt#;		% vertical drop of sloped serifs
stem_corr#:=1/36pt#;		% for small refinements of stem breadth
vair_corr#:=1/36pt#;		% for small refinements of hairline height
apex_corr#:=0pt#;		% extra width at diagonal junctions

o#:=8/36pt#;			% amount of overshoot for curves
apex_o#:=12/36pt#;		% amount of overshoot for diagonal junctions

slant:=.25;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=1;			% factor applied to weights of heavy characters
math_spread:=0;			% extra openness of math symbols
superness:=1/sqrt2;		% parameter for superellipses
superpull:=1/6;			% extra openness inside bowls
beak_darkness:=11/30;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=false;		% should dots be square?
hefty:=false;			% should we try hard not to be overweight?
serifs:=true;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=true;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate italic			% use the file italic.mf to generate a font
% Computer Modern Bold Roman 10 point
if unknown cmbase: input cmbase fi

font_identifier:="CMB"; font_size 10pt#;

u#:=20/36pt#;			% unit width
width_adj#:=0pt#;		% width adjustment for certain characters
serif_fit#:=0pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=5/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=0pt#;		% extra space added to all sidebars

body_height#:=270/36pt#;	% height of tallest characters
asc_height#:=250/36pt#;		% height of lowercase ascenders
cap_height#:=247/36pt#;		% height of caps
fig_height#:=232/36pt#;		% height of numerals
x_height#:=160/36pt#;		% height of lowercase without ascenders
math_axis#:=90/36pt#;		% axis of symmetry for math symbols
bar_height#:=80/36pt#;		% height of crossbar in lowercase e
comma_depth#:=70/36pt#;		% depth of comma below baseline
desc_depth#:=70/36pt#;		% depth of lowercase descenders

crisp#:=0pt#;			% diameter of serif corners
tiny#:=13/36pt#;		% diameter of rounded corners
fine#:=10/36pt#;		% diameter of sharply rounded corners
thin_join#:=10/36pt#;		% width of extrafine details
hair#:=17/36pt#;		% lowercase hairline breadth
stem#:=41/36pt#;		% lowercase stem breadth
curve#:=46/36pt#;		% lowercase curve breadth
ess#:=38/36pt#;			% breadth in middle of lowercase s
flare#:=45/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=56/36pt#;		% diameter of dots
cap_hair#:=19/36pt#;		% uppercase hairline breadth
cap_stem#:=51/36pt#;		% uppercase stem breadth
cap_curve#:=55/36pt#;		% uppercase curve breadth
cap_ess#:=53/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=.6pt#;		% thickness of lines in math symbols

cup#:=2/36pt#;			% amount erased at top or bottom of serifs
bracket#:=10/36pt#;		% vertical distance from serif base to tangent
jut#:=25/36pt#;			% protrusion of lowercase serifs
cap_jut#:=39/36pt#;		% protrusion of uppercase serifs
beak_jut#:=11/36pt#;		% horizontal protrusion of beak serifs
beak#:=70/36pt#;		% vertical protrusion of beak serifs
vair#:=13/36pt#;		% vertical diameter of hairlines
notch_cut#:=10pt#;		% maximum breadth above or below notches
bar#:=17/36pt#;			% lowercase bar thickness
slab#:=17/36pt#;		% serif and arm thickness
cap_bar#:=17/36pt#;		% uppercase bar thickness
cap_band#:=17/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=10pt#;		% max breadth above/below uppercase notches
serif_drop#:=3/36pt#;		% vertical drop of sloped serifs
stem_corr#:=2/36pt#;		% for small refinements of stem breadth
vair_corr#:=1.5/36pt#;		% for small refinements of hairline height
apex_corr#:=0pt#;		% extra width at diagonal junctions

o#:=6/36pt#;			% amount of overshoot for curves
apex_o#:=9/36pt#;		% amount of overshoot for diagonal junctions

slant:=0;			% tilt ratio $(\Delta x/\Delta y)$
fudge:=1;			% factor applied to weights of heavy characters
math_spread:=.5;		% extra openness of math symbols
superness:=8/11;		% parameter for superellipses
superpull:=1/8;			% extra openness inside bowls
beak_darkness:=.4;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=false;		% should dots be square?
hefty:=false;			% should we try hard not to be overweight?
serifs:=true;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=false;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font
% Computer Modern Funny 10 point
if unknown cmbase: input cmbase fi

font_identifier:="CMFF"; font_size 10pt#;

u#:=16/36pt#;			% unit width
width_adj#:=-16/36pt#;		% width adjustment for certain characters
serif_fit#:=-3/36pt#;		% extra sidebar near lowercase serifs
cap_serif_fit#:=-4/36pt#;	% extra sidebar near uppercase serifs
letter_fit#:=2/36pt#;		% extra space added to all sidebars

body_height#:=240/36pt#;	% height of tallest characters
asc_height#:=220/36pt#;		% height of lowercase ascenders
cap_height#:=225/36pt#;		% height of caps
fig_height#:=210/36pt#;		% height of numerals
x_height#:=190/36pt#;		% height of lowercase without ascenders
math_axis#:=55/36pt#;		% axis of symmetry for math symbols
bar_height#:=30/36pt#;		% height of crossbar in lowercase e
comma_depth#:=70/36pt#;		% depth of comma below baseline
desc_depth#:=100/36pt#;		% depth of lowercase descenders

crisp#:=10/36pt#;		% diameter of serif corners
tiny#:=0pt#;			% diameter of rounded corners
fine#:=0pt#;			% diameter of sharply rounded corners
thin_join#:=14/36pt#;		% width of extrafine details
hair#:=12/36pt#;		% lowercase hairline breadth
stem#:=16/36pt#;		% lowercase stem breadth
curve#:=20/36pt#;		% lowercase curve breadth
ess#:=22/36pt#;			% breadth in middle of lowercase s
flare#:=24/36pt#;		% diameter of bulbs or breadth of terminals
dot_size#:=26/36pt#;		% diameter of dots
cap_hair#:=16/36pt#;		% uppercase hairline breadth
cap_stem#:=24/36pt#;		% uppercase stem breadth
cap_curve#:=26/36pt#;		% uppercase curve breadth
cap_ess#:=28/36pt#;		% breadth in middle of uppercase s
rule_thickness#:=.5pt#;		% thickness of lines in math symbols

cup#:=5/36pt#;			% amount erased at top or bottom of serifs
bracket#:=20/36pt#;		% vertical distance from serif base to tangent
jut#:=3/36pt#;			% protrusion of lowercase serifs
cap_jut#:=4/36pt#;		% protrusion of uppercase serifs
beak_jut#:=-8/36pt#;		% horizontal protrusion of beak serifs
beak#:=-5/36pt#;		% vertical protrusion of beak serifs
vair#:=14/36pt#;		% vertical diameter of hairlines
notch_cut#:=2/36pt#;		% maximum breadth above or below notches
bar#:=17/36pt#;			% lowercase bar thickness
slab#:=20/36pt#;		% serif and arm thickness
cap_bar#:=22/36pt#;		% uppercase bar thickness
cap_band#:=17/36pt#;		% uppercase thickness above/below lobes
cap_notch_cut#:=3/36pt#;	% max breadth above/below uppercase notches
serif_drop#:=-10/36pt#;		% vertical drop of sloped serifs
stem_corr#:=-1/36pt#;		% for small refinements of stem breadth
vair_corr#:=-1/36pt#;		% for small refinements of hairline height
apex_corr#:=6/36pt#;		% extra width at diagonal junctions

o#:=4/36pt#;			% amount of overshoot for curves
apex_o#:=9/36pt#;		% amount of overshoot for diagonal junctions

slant:=-.1;			% tilt ratio $(\Delta x/\Delta y)$
ph=220/36; px=190/36; pe=30/36; pd=100/36;
pb=20/36; po=4/36; ps=20/36; pas=-5/36; pa=.5(ph-pd);
pw=12/36; pwi=16/36; pwii=20/36; pwiii=24/36;
pwiv=24/36; pwv=26/36; aspect=1.1; pdel=6/36; fudge=1.0;
pu=16/36; lcs=3/16; ucs=4/16; sc=.2; ls=0;
slant=-.1; sqrttwo=1.5; fixwidth=0; crisp=0;
phh=ph+5/36; phhh=.95ph; pssd=-10/36; pdd=pd; varg=0; lowast=0; ligs=1.
fudge:=1;			% factor applied to weights of heavy characters
math_spread:=.5;		% extra openness of math symbols
superness:=2/3;			% parameter for superellipses
superpull:=-1/8;		% extra openness inside bowls
beak_darkness:=.5;		% fraction of triangle inside beak serifs
ligs:=1;			% level of ligatures to be included

square_dots:=true;		% should dots be square?
hefty:=false;			% should we try hard not to be overweight?
serifs:=true;			% should serifs and bulbs be attached?
monospace:=false;		% should all characters have the same width?
variant_g:=false;		% should an italic-style g be used?
low_asterisk:=false;		% should the asterisk be centered at the axis?
math_fitting:=false;		% should math-mode spacing be used?

generate roman			% use the file roman.mf to generate a font